package com.tinyengine.it.model.vo.vue;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 实体类
 *
 * @author Chill
 */
@Schema(description = "Menu对象")
@Data
@Accessors(chain = true)
public class MenuVo implements Serializable {

    /**
     * 主键
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(description = "主键")
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private Long id;

    /**
     * 菜单父主键
     */
    @JsonSerialize(using = ToStringSerializer.class)
    @Schema(description = "菜单父主键")
    private Long parentId;

    /**
     * 菜单编号
     */
    @Schema(description = "菜单编号")
    private String code;

    /**
     * 菜单名称
     */
    @Schema(description = "菜单名称")
    private String name;

    /**
     * 菜单别名
     */
    @Schema(description = "菜单别名")
    private String alias;

    /**
     * 请求地址
     */
    @Schema(description = "请求地址")
    private String path;

    /**
     * 菜单资源
     */
    @Schema(description = "菜单资源")
    private String source;

    /**
     * 组件资源
     */
    @Schema(description = "组件资源")
    private String component;

    /**
     * 排序
     */
    @Schema(description = "排序")
    private Integer sort;

    /**
     * 菜单类型
     */
    @Schema(description = "菜单类型")
    private Integer category;

    /**
     * 操作按钮类型
     */
    @Schema(description = "操作按钮类型")
    private Integer action;

    /**
     * 是否打开新页面
     */
    @Schema(description = "是否打开新页面")
    private Integer isOpen;

    /**
     * 备注
     */
    @Schema(description = "备注")
    private String remark;

    /**
     * 是否已删除
     */
    @TableLogic
    @Schema(description = "是否已删除")
    private Integer isDeleted;

    public String generateInsertSQL() {
        return String.format("""
                        INSERT INTO blade_menu (
                            id, parent_id, code, name, alias, path,
                            source, sort, category, action, is_open,
                            component, remark, is_deleted
                        ) VALUES (
                            %d, %d, %s, %s, %s, %s,
                            %s, %s, %s, %s, %s,
                            %s, %s, %s
                        );
                        """,
                this.getId(),
                this.getParentId(),
                toSqlString(this.getCode()),
                toSqlString(this.getName()),
                toSqlString(this.getAlias()),
                toSqlString(this.getPath()),
                toSqlString(this.getSource()),
                toSqlNumber(this.getSort()),
                toSqlNumber(this.getCategory()),
                toSqlNumber(this.getAction()),
                toSqlNumber(this.getIsOpen()),
                toSqlString(this.getComponent()),
                toSqlString(this.getRemark()),
                toSqlNumber(this.getIsDeleted())
        );
    }

    // 把字符串包装为 SQL 字符串，空值转 NULL
    private static String toSqlString(String val) {
        return val == null ? "NULL" : "'" + val.replace("'", "''") + "'";
    }

    // 把整数转为 SQL 数字，空值转 NULL
    private static String toSqlNumber(Integer val) {
        return val == null ? "NULL" : String.valueOf(val);
    }

}
